#include <stdio.h>
#include <errno.h> 
#include <fcntl.h>
    
int main (int argc, char** argv) {
	if (argc !=3) {
        fprintf(stderr,"Give Source and Destination Path!\n");
        return 1;
    }
        char* source = argv[1];
        char* destination = argv[2];
        
        /* 
         * open Source 
         */
         int srcPath = open(source, O_RDONLY);
         //Error Handling mit Ausgabe von Error Text bei wichtigen Fehlern sonst Ausgabe von errnoVariable
         if (srcPath < 0 ) {
			fprintf(stderr,"Could not open file at source Path \"%s\"\n", source);
			
			fprintf(stderr,"%s!\n", strerror(errno));    
			return 1;	
			
		}
             
        /* open Destination
         * create if not exists but don't create if exists (excl) 
         */         
        int destPath = open(destination, O_WRONLY | O_CREAT | O_EXCL, 0644 );
        
        //Error Handling mit Ausgabe von Error Text bei wichtigen Fehlern sonst Ausgabe von errnoVariable
        if (destPath < 0 ) {
			fprintf(stderr,"Could not create file at destination \"%s\"\n", destination);
			
			fprintf(stderr,"%s! \n", strerror(errno));
			return 1;
					   
		}
		
		char buffer[1];
		/*
		 *  Read
		 */
		int readSrc = -1;
		
	while ((readSrc = read(srcPath, buffer, 1)) != 0) {
		
		//Read Error Handling mit Ausgabe von Error Text bei wichtigen Fehlern sonst Ausgabe von errnoVariable 
		if (readSrc < 0 ) {
			fprintf(stderr,"Could not read file from source!");
			
			fprintf(stderr,"%s! \n", strerror(errno));      
			return 1;	   
		}
		/*
		 * Write
		 */
		 int writeDest = write(destPath, buffer, 1);
		 
		 ////Write Error Handling mit Ausgabe von Error Text bei wichtigen Fehlern sonst Ausgabe von errnoVariable 
		if (writeDest < 0 ) {
			fprintf(stderr,"Could not write to file!");
			
			fprintf(stderr,"%s! \n", strerror(errno));      
			return 1;		   
		}
	}
		/*
		 * Close
		 */
		 close(srcPath);
		 close(destPath);
		 
    return 0;	
}
